package com.kaifamiao.operators;

// 位运算符
// | 按位或(逐位或)
// & 按位与(逐位与)
// ~ 按位取反(逐位取反)
// ^ 按位异或(逐位异或)
// >> 向右移位
// << 向左移位
// >>> 无符号向右移位
public class Bull {
    public static void main(String[] args) {

        final int a = 0b0000_0000_0000_0000_0000_0000_0000_0111;
        final int b = 0b0000_0000_0000_0000_0000_0000_0000_0101;

        // 按位或(逐位或)
        // 0b0000_0000_0000_0000_0000_0000_0000_0111
        // 0b0000_0000_0000_0000_0000_0000_0000_0101
        int first = a | b ;
        // 0b0000_0000_0000_0000_0000_0000_0000_0111
        System.out.println( first );

        // & 按位与(逐位与)
        // 0b0000_0000_0000_0000_0000_0000_0000_0111
        // 0b0000_0000_0000_0000_0000_0000_0000_0101
        int second = a & b;
        // 0b0000_0000_0000_0000_0000_0000_0000_0101
        System.out.println( first );

        // 0b0000_0000_0000_0000_0000_0000_0000_0111
        int third = ~a ;
        // 0b1111_1111_1111_1111_1111_1111_1111_1000
        System.out.println( third );

        // 按位异或(逐位异或)
        // 0b0000_0000_0000_0000_0000_0000_0000_0111
        // 0b0000_0000_0000_0000_0000_0000_0000_0101
        int fourth = a ^ b;
        // 0b0000_0000_0000_0000_0000_0000_0000_0010
        System.out.println( fourth );

        int c = 0b0000_0000_0000_0000_0000_0000_0000_0111;
        // 向右移 2 位
        int fifth = c >> 2;
        // 0b00_0000_0000_0000_0000_0000_0000_0000_01
        System.out.println( fifth );

        // 向左移 2 位
        int sixth = c << 2;
        // 0b00_0000_0000_0000_0000_0000_0000_0111_00
        System.out.println( sixth );

        int d = 0b1111_1111_1111_1111_1111_1111_1111_1000;
        // >> 有符号向右移位
        // 0b11_1111_1111_1111_1111_1111_1111_1111_10
        System.out.println( d >> 2 );

        // >>> 无符号向右移位
        // 0b00_1111_1111_1111_1111_1111_1111_1111_10
        System.out.println( d >>> 2 );

    }
}
